gtkmagnifier: Avoid a crash if the inspected widget is finalized
authorRui Matos <tiagomatos@gmail.com>
Tue, 9 Feb 2016 14:30:00 +0000 (15:30 +0100)
committerRui Matos <tiagomatos@gmail.com>
Tue, 9 Feb 2016 14:35:17 +0000 (15:35 +0100)
If the inspected widget is finalized and we then try to disconnect
from its signals we'll crash.

https://bugzilla.gnome.org/show_bug.cgi?id=761775

gtk/gtkmagnifier.c

index e83d3066fef1653274e3e4372da7c8c2ebdcaf84..29905fb5843bf007db47db9d692e94ecb74b8ec5 100644 (file)
@@ -204,7 +204,8 @@ disconnect_resize_handler (GtkMagnifier *magnifier)
 
   if (priv->resize_handler)
     {
-      g_signal_handler_disconnect (priv->inspected, priv->resize_handler);
+      if (priv->inspected)
+        g_signal_handler_disconnect (priv->inspected, priv->resize_handler);
       priv->resize_handler = 0;
     }
 }
@@ -239,7 +240,8 @@ disconnect_draw_handler (GtkMagnifier *magnifier)
 
   if (priv->draw_handler)
     {
-      g_signal_handler_disconnect (priv->inspected, priv->draw_handler);
+      if (priv->inspected)
+        g_signal_handler_disconnect (priv->inspected, priv->draw_handler);
       priv->draw_handler = 0;
     }
 }
@@ -343,7 +345,13 @@ _gtk_magnifier_set_inspected (GtkMagnifier *magnifier,
   disconnect_draw_handler (magnifier);
   disconnect_resize_handler (magnifier);
 
+  if (priv->inspected)
+    g_object_remove_weak_pointer (G_OBJECT (priv->inspected),
+                                  (gpointer *) &priv->inspected);
   priv->inspected = inspected;
+  if (priv->inspected)
+    g_object_add_weak_pointer (G_OBJECT (priv->inspected),
+                               (gpointer *) &priv->inspected);
 
   connect_draw_handler (magnifier);
   connect_resize_handler (magnifier);